/****************************************************************
*                                                               *
*  ------------------------- route.c -------------------------  *
*                                                               *
****************************************************************/

#include <stdlib.h>

#include "graphalg.h"
#include "list.h"

/****************************************************************
*                                                               *
*  -------------------------- route --------------------------  *
*                                                               *
****************************************************************/

int route(List *chemins, PathVertex *destination, 
          PathVertex **suivant, 
          int(*corresp)(const void *cle1, const void *cle2)) {

PathVertex         *temp,
                   *parent;

ListNode           *element;

int                trouve;

/****************************************************************
*                                                               *
*  Trouve la destination dans la liste des passerelles.         *
*                                                               *
****************************************************************/

trouve = 0;

for (element = list_head(chemins); element != NULL; 
     element = list_next(element)) {

   if (corresp(list_data(element), destination)) {

      temp = list_data(element);
      parent = ((PathVertex *)list_data(element))->parent;
      trouve = 1;
      break;

   }

}

/****************************************************************
*                                                               *
*  Renvoie -1 si la destination n'est pas accessible.           *
*                                                               *
****************************************************************/

if (!trouve)
   return -1;

/****************************************************************
*                                                               *
*  Calcule la passerelle suivante dans le plus court chemin     *
*  vers destination.                                            *
*                                                               *
****************************************************************/

while (parent != NULL) {

   temp = list_data(element);
   trouve = 0;

   for (element = list_head(chemins); element != NULL; 
        element = list_next(element)) {

      if (corresp(list_data(element), parent)) {

         parent = ((PathVertex *)list_data(element))->parent;
         trouve = 1;
         break;

      }

   }

   /*************************************************************
   *                                                            *
   *  Renvoie -1 si la destination n'est pas accessible.        *
   *                                                            *
   *************************************************************/

   if (!trouve)
      return -1;

}

*suivant = temp;

return 0;

}
